package annotation

// Initialize 标识结构体为一个带初始化方法的bean
// 提供注解的作用，不允许外部实现
// 这里采用和 [Component] 注解不同的方式实现，目的都是为了尽可能少的暴露对象出去
// [Component] 这种实现方式有一个优点就是，约束了指针实现，如果用泛型约束 [gspringBean] 接受参数的话，必须传指针才可以
// 采用此种方式的优点就是，外部方便使用 [bean.(Initialize)] 断言调用 Init() 方法
type Initialize interface {
	// 该方法无需实现，标记该接口用作注解
	initializeAnnotation()

	// Init 初始化方法
	Init()
}

//var _ initializeAnno = (*Initialize)(nil)
//
//// Initialize 开发者可以将它作为内嵌属性字段，然后实现Init方法，且Init方法必须实现，不实现会panic
//type Initialize struct {
//	initializeAnno
//}
//
//// markInitializeAnnotation 约束了指针实现
//func (*Initialize) markInitializeAnnotation() {}
//
//// GetRtInitializeAnno 返回接口 [initializeAnno] 的反射类型
//func (*Initialize) GetRtInitializeAnno() reflect.Type {
//	return reflect.TypeOf((*initializeAnno)(nil)).Elem()
//}
//
//// Execute 执行 initializeAnno.Init() 方法
//func (*Initialize) Execute(bean any) {
//	if initAnno, ok := bean.(initializeAnno); ok {
//		initAnno.Init()
//	}
//}
